package GestorClinico;

/**
 * @file DireccionDAO.java
 * @brief Implementa la clase DireccionDAO.java
 * 
 * Implementa la clase DireccionDAO usada para manejar la información de
 * las direcciones del sistema en la base de datos.
 * 
 * @author Víctor Martínez Gómez
 * @version 01.04
 * 
 */

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import GestorUsuarios.IDException;
import Servicios.Conexion;

/**
 * @class DireccionDAO
 * 
 * @brief Se encarga de realizar las operaciones para manejar la información de
 * 		  las direcciones del sistema en la base de datos.
 * 
 *        Se encarga de realizar las operaciones para manejar la información de
 *		  las direcciones del sistema. Permite realizar búsquedas, añadirlas a la
 *		  base de datos, etc.
 * 
 */


public class DireccionDAO {
	
	/**
	 * @brief Agrega el objeto Direccion a la BD
	 * @param direccion Direccion a agregar
	 * @throws ClassNotFoundException, IOException, SQLException, IDException 
	 */
	public static void add(Direccion direccion) throws SQLException, IOException, ClassNotFoundException, IDException {
		Conexion.conectar();
		Conexion.actualizar("INSERT Direccion(direccion,localidad,CP,pais,telefono) VALUES (\'"+
				direccion.getDireccion()+
				"\', \'"+ direccion.getLocalidad() +
				"\', "+ direccion.getCP() +
				", \'"+ direccion.getPais() +
				"\',"+ direccion.getTelefono() + ");");

		Direccion[] direccion_bd =  get(direccion.getDireccion(), direccion.getLocalidad(), direccion.getCP(), direccion.getPais(), direccion.getTelefono());
		Conexion.desconectar();
		// Establecemos el id asignado en la base de datos
		if(direccion_bd==null) {
			throw new IDException();
		}
		direccion.setIdDireccion(direccion_bd[direccion_bd.length-1].getIdDireccion());
	}
	
	/**
	 * @brief Obtiene la instancia de Direccion con el id indicado
	 * @param id Id de la dirección a buscar
	 * @return El objeto Direccion obtenido
	 * @throws ClassNotFoundException, IOException, SQLException
	 */
	public static Direccion get(int id) throws SQLException, IOException, ClassNotFoundException {
		Direccion direccion;
		Conexion.conectar();
		ResultSet tabla = Conexion.consultar("SELECT * FROM Direccion WHERE Direccion.idDireccion = "+ id +";");
		if(tabla.next()) { // Encontrado
			direccion = new Direccion(tabla.getInt("idDireccion"), tabla.getString("direccion"),
					tabla.getString("localidad"), tabla.getInt("CP"), tabla.getString("pais"),
					tabla.getInt("telefono"));
		} else {
			direccion = null;
		}
		Conexion.desconectar();
		return direccion;
	}
	
	/**
	 * @brief Obtiene la instancia de Direccion con el id indicado
	 * @param id Id de la dirección a buscar
	 * @return El objeto Direccion obtenido
	 * @throws ClassNotFoundException, IOException, SQLException
	 */
	public static Direccion[] get(String direccion, String localidad, Integer CP, String pais, Integer telefono) throws SQLException, IOException, ClassNotFoundException {
		Direccion [] direcciones = null;
		
		String parte_sel = "WHERE ";
		if(direccion!=null)
			parte_sel += " direccion = \'"+ direccion +"\' AND ";
		if(localidad!=null)
			parte_sel += " localidad = \'"+ localidad +"\' AND ";
		if(CP!=null)
			parte_sel += " CP = \'"+ CP +"\' AND ";
		if(pais!=null)
			parte_sel += " pais = \'"+ pais +"\' AND ";
		if(telefono!=null)
			parte_sel += " telefono = \'"+ telefono +"\' AND ";
		
		// Sustituimos coma final, por punto y coma
		parte_sel = parte_sel.substring(0, parte_sel.length()-4)+";";
		
		Conexion.conectar();
		
		ResultSet tabla = Conexion.consultar("SELECT * FROM Direccion " + parte_sel);
		
		ArrayList<Direccion> list_direcciones = new ArrayList<Direccion>();
		while(tabla.next()) {
			
			list_direcciones.add(new Direccion(tabla.getInt("idDireccion"),tabla.getString("direccion"),
					tabla.getString("localidad"), tabla.getInt("CP"), tabla.getString("pais"),tabla.getInt("telefono")));
		}
		
		Conexion.desconectar();
		
		
		if(list_direcciones.size()>0) {
			direcciones = new Direccion[list_direcciones.size()];
			list_direcciones.toArray(direcciones);
			return direcciones;
		}
		else return null;
	}
	
	
	/**
	 * @brief Obtiene la instancia de Direccion con los parametros indicados
	 * @return El objeto Direccion obtenido
	 * @throws ClassNotFoundException, IOException, SQLException
	 */
	public static Direccion[] get(Integer idUsuario, Integer idDireccion) throws SQLException, IOException, ClassNotFoundException {
		Direccion [] direcciones = null;
		
		String consulta = "";
		if(idUsuario==null && idDireccion!=null)	// Solo por direccion
			consulta = "SELECT * FROM Direccion WHERE idDireccion="+idDireccion+";";
		if(idUsuario!=null && idDireccion==null)	// Solo por usuario
			consulta = "SELECT d.idDireccion, d.direccion, d.localidad, d.CP, d.pais, d.telefono FROM Direccion d, Usuario u, resideEn r WHERE d.idDireccion = r.idDireccion AND u.idUsuario = r.idUsuario AND u.idUsuario = "+idUsuario+";";
		if(idUsuario!=null && idDireccion!=null)
			consulta = "SELECT d.idDireccion, d.direccion, d.localidad, d.CP, d.pais, d.telefono FROM Direccion d, Usuario u, resideEn r WHERE d.idDireccion = r.idDireccion AND u.idUsuario = r.idUsuario AND u.idUsuario = "+idUsuario+" AND d.idDireccion = "+idDireccion+";";
		
		Conexion.conectar();
		
		ResultSet tabla = Conexion.consultar(consulta);
		
		ArrayList<Direccion> list_direcciones = new ArrayList<Direccion>();
		while(tabla.next()) {
			
			list_direcciones.add(new Direccion(tabla.getInt("idDireccion"),tabla.getString("direccion"),
					tabla.getString("localidad"), tabla.getInt("CP"), tabla.getString("pais"),tabla.getInt("telefono")));
		}
		
		Conexion.desconectar();
		
		
		if(list_direcciones.size()>0) {
			direcciones = new Direccion[list_direcciones.size()];
			list_direcciones.toArray(direcciones);
			return direcciones;
		}
		else return null;
	}
	
	/**
	 * @brief Actualiza la información asociada al objeto Direccion
	 * @param usuario Direccion a actualizar
	 * @throws ClassNotFoundException, IOException, SQLException
	 */
	public static void update(Direccion direccion) throws SQLException, IOException, ClassNotFoundException {
		
		Conexion.conectar();
		Conexion.actualizar("UPDATE Direccion SET direccion=\'"+direccion.getDireccion()+
				"\', localidad = \'"+ direccion.getLocalidad() +
				"\', CP = \'"+ direccion.getCP() +
				"\', pais = \'"+ direccion.getPais() +
				"\', telefono = \'"+ direccion.getTelefono() +
				"\' WHERE idDireccion="+direccion.getIdDireccion()+";");
		Conexion.desconectar();
	}
	
	/**
	 * @brief Relaciona un usuario con una direccion
	 * @param idUsuario Id del usuario
	 * @param direccion Objeto direccion a conectar
	 * @throws ClassNotFoundException, IOException, SQLException
	 */
	public static void setDireccionUsuario(int idUsuario, Direccion direccion) throws SQLException, IOException, ClassNotFoundException {
		Conexion.conectar();
		Conexion.actualizar("INSERT resideEn(idUsuario,idDireccion) VALUES (\'"+
				idUsuario+"\',"+ direccion.getIdDireccion() + ");");
		Conexion.desconectar();
	}
	
	/**
	 * @brief Elimina todas las relaciones de un usuario con direcciones
	 * @param idUsuario Id del usuario
	 * @throws ClassNotFoundException, IOException, SQLException
	 */
	public static void deleteDirecciones(int idUsuario) throws SQLException, IOException, ClassNotFoundException {
		Conexion.conectar();
		Conexion.actualizar("DELETE FROM resideEn WHERE  idUsuario=\'"+idUsuario+"\';");
		Conexion.desconectar();
	}

}